// 断言的问题
let strOrNum: string | number // 如果是联合类型在使用方法的时候 只能采用公共的方法来使用
// 还是从安全性考虑，在使用联合类型的时候 我们通常会先定义值，再使用保证安全

// 1) 指定类型再使用

// 2）断言类型后再使用 as断言成某种类型（一定是联合类型中的某一个）!
(strOrNum! as string).charCodeAt(0);
(<number>strOrNum!).toFixed(3);

/**
 * !TS语法 ?js语法 链判断运算符（如果值有再去取值）
 */ 

let ele = document.getElementById('app');
// ele!.style.background = 'red'

(ele as HTMLElement).style.background = 'red'

// ? 表示的是取值操作，不能赋值， ! 表示某个变量一定存在
// ele!.style.background = 'red'

// ?? js语法 合并空值运算符， 三元表达式 但是 false || 取的结果

let val = 0 || 100; // 除了 null 和 undefined 其他都是true

// 值 as xxx 或者 <xxx>值 一般用于联合类型

(strOrNum! as unknown as boolean); // 双重断言，一般不建议使用，但是还会用到，破坏原有的关系

// 类型别名将类型提取出来
type Direction = 'up' | 'down' | 'left' | 'right'
let direction: Direction = 'up'
let up: 'down' = direction as 'down'

export {}
